_gdk_display_create_window_impl (display, window, real_parent, screen, event_mask, attributes, attributes_mask);
window->impl_window = window;
+ if (parent)
+ parent->impl_window->native_children = g_list_prepend (parent->impl_window->native_children, window);
+
/* This will put the native window topmost in the native parent, which may
* be wrong wrt other native windows in the non-native hierarchy, so restack */
if (!_gdk_window_has_impl (real_parent))
if (child->impl == old_impl)
change_impl (child, impl_window, new);
+ else
+ {
+ /* The child is a native, update native_children */
+ old_impl_window->native_children =
+ g_list_remove (old_impl_window->native_children, child);
+ impl_window->native_children =
+ g_list_prepend (impl_window->native_children, child);
+ }
}
}
}
if (old_parent)
- old_parent->children = g_list_remove (old_parent->children, window);
+ {
+ old_parent->children = g_list_remove (old_parent->children, window);
+
+ if (gdk_window_has_impl (window))
+ old_parent->impl_window->native_children =
+ g_list_remove (old_parent->impl_window->native_children, window);
+ }
window->parent = new_parent;
window->x = x;
new_parent->children = g_list_prepend (new_parent->children, window);
+ if (gdk_window_has_impl (window))
+ new_parent->impl_window->native_children = g_list_prepend (new_parent->impl_window->native_children, window);
+
/* Switch the window type as appropriate */
switch (GDK_WINDOW_TYPE (new_parent))
GdkWindowImpl *new_impl, *old_impl;
GdkDisplay *display;
GdkScreen *screen;
- GdkWindow *above;
+ GdkWindow *above, *parent;
GList listhead;
GdkWindowImplClass *impl_class;
screen = gdk_window_get_screen (window);
display = gdk_screen_get_display (screen);
+ parent = window->parent;
old_impl = window->impl;
_gdk_display_create_window_impl (display,
- window, window->parent,
+ window, parent,
screen,
get_native_event_mask (window),
NULL, 0);
new_impl = window->impl;
+ if (parent)
+ parent->impl_window->native_children =
+ g_list_prepend (parent->impl_window->native_children, window);
+
window->impl = old_impl;
change_impl (window, window, new_impl);
* native parent, which may be wrong wrt the position of the previous
* non-native window wrt to the other non-native children, so correct this.
*/
- above = find_native_sibling_above (window->parent, window);
+ above = find_native_sibling_above (parent, window);
if (above)
{
listhead.data = window;
if (window->parent->children)
window->parent->children = g_list_remove (window->parent->children, window);
+ if (gdk_window_has_impl (window))
+ window->parent->impl_window->native_children =
+ g_list_remove (window->parent->impl_window->native_children, window);
+
if (!recursing &&
GDK_WINDOW_IS_MAPPED (window))
{
}
g_list_free (children);
+
+ if (gdk_window_has_impl (window))
+ g_assert (window->native_children == NULL);
}
_gdk_window_clear_update_area (window);